/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Aplicacion.java
 *
 * Created on 20-nov-2010, 11:28:05
 */

package formulario;

import archivo.Abrir;
import archivo.Archivo;
import archivo.ArchivoDeConfiguracion;
import archivo.ArchivoExistente;
import archivo.Guardar;
import bd.Conexion;
import clases.*;
import encriptacion.ArchivoDesencriptado;
import encriptacion.Encriptacion;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ComponentListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JLabel;
import javax.swing.border.EtchedBorder;

/**
 *
 * @author Fabiola
 */
public class Aplicacion extends javax.swing.JFrame {
    private javax.swing.JLabel[][] labels;
    private int ANCHO;
    private int ALTO;
    private int CANTIDAD_DE_MINAS;
    private int CANTIDAD_DE_MINAS_AUX;
    private int CANTIDAD_DE_MINAS_LABEL;
    private int ALTO_BOTON = 17;
    private int ANCHO_BOTON = 17;
    private int TAMAÑO_NUMEROS;
    private int PUNTO_DE_INICIO_X;
    private int PUNTO_DE_INICIO_Y;
    private int ALTO_PANTALLA;
    private int ANCHO_PANTALLA;
    private int MAXIMO_ANCHO;
    private int MAXIMO_ALTO;
    private int CONTADOR_BANDERAS;
    private float PORCENTAJE_DIFICULTAD;
    private String NIVEL;
    private JLabel lbl_nivel;
    private JLabel monito = new JLabel();
    private JLabel contMinas = new JLabel();
    private JLabel segundos = new JLabel();
    private HiloSegundos h = new HiloSegundos();
    private String FRASE_TRUCO_1;
    private String FRASE_TRUCO_1_A_COMPARAR;
    private String FRASE_NUEVO_JUEGO;
    private String FRASE_NUEVO_JUEGO_A_COMPARAR;
    private final String RUTA_ARCHIVO_TIEMPOS = "dat/tiempos.jbm";
    private final String RUTA_ARCHIVO_GUARDADO_AUTOMATICO = "dat/guardadoAutomatico.jbmga";
    private ArchivoDeConfiguracion archivo_tiempo;
    private String cifrado;
    private int WIDTHFORM;
    private int HEIGHTFORM;
    private boolean estado_tamaño = false;
    

    private static Punto puntoMina = new Punto();
    private boolean TRUCO = false;
    private String TITULO = "JBuscaminas";
    /** Creates new form Aplicacion */
    public Aplicacion() {
        initComponents();
        if(new File(RUTA_ARCHIVO_GUARDADO_AUTOMATICO).length() == 0){
            iniciarJuego(10, 9, 9, "Principiante");
        }else{
            ArchivoDesencriptado ardes = new ArchivoDesencriptado();
            ardes = desencriptar(RUTA_ARCHIVO_GUARDADO_AUTOMATICO);
            ArchivoDeConfiguracion a = new ArchivoExistente(ardes.getRuta());
            if(Integer.parseInt(a.getValorDeConfiguracion("minas")) != 0){
                iniciarJuego(10, 9, 9, "Principiante");
                iniciarJuegoAutomatico();
            }else{
                iniciarJuego(10, 9, 9, "Principiante");
            }
            new File(ardes.getRuta()).delete();
        }
//        iniciarJuego(10, 9, 9, "Principiante");
        h.start();
        setAnchoAltoPantalla();
        inicializarArchivoTiempo();
        WIDTHFORM = this.getWidth();
        HEIGHTFORM = this.getHeight();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        Form_personalizar = new javax.swing.JFrame();
        panel = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        lblancho = new javax.swing.JLabel();
        lblalto = new javax.swing.JLabel();
        lblminas = new javax.swing.JLabel();
        anc = new javax.swing.JTextField();
        alt = new javax.swing.JTextField();
        min = new javax.swing.JTextField();
        lblporcentaje = new javax.swing.JLabel();
        btnJugar = new javax.swing.JButton();
        dialogo_tiempos = new javax.swing.JDialog();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        tab = new javax.swing.JTable();
        Form_tamaño = new javax.swing.JFrame();
        jPanel2 = new javax.swing.JPanel();
        jLabel3 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        anchocfg = new javax.swing.JTextField();
        altocfg = new javax.swing.JTextField();
        btnGuardar = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        nuevoJuego = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        jMenuItem2 = new javax.swing.JMenuItem();
        menupausar = new javax.swing.JMenuItem();
        menuguardar = new javax.swing.JMenuItem();
        jSeparator3 = new javax.swing.JPopupMenu.Separator();
        nivelPrincipiante = new javax.swing.JCheckBoxMenuItem();
        nivelIntermedio = new javax.swing.JCheckBoxMenuItem();
        nivelExperto = new javax.swing.JCheckBoxMenuItem();
        personalizarJuego = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JPopupMenu.Separator();
        tablaDeTiempos = new javax.swing.JMenuItem();
        jSeparator4 = new javax.swing.JPopupMenu.Separator();
        jMenuItem3 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();

        Form_personalizar.getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        panel.setBorder(javax.swing.BorderFactory.createTitledBorder("Juego Personalizado"));
        panel.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel1.setFont(new java.awt.Font("Tahoma", 3, 11));
        jLabel1.setText("Ancho:");
        panel.add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 30, 50, 20));

        jLabel2.setFont(new java.awt.Font("Tahoma", 3, 11));
        jLabel2.setText("Alto:");
        panel.add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 60, 50, 20));

        jLabel4.setFont(new java.awt.Font("Tahoma", 3, 11));
        jLabel4.setText("Minas :");
        panel.add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(30, 90, 50, 20));

        lblancho.setForeground(java.awt.SystemColor.controlShadow);
        lblancho.setText("Valor Máximo:");
        panel.add(lblancho, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 30, 140, 20));

        lblalto.setForeground(java.awt.SystemColor.controlShadow);
        lblalto.setText("Valor Máximo:");
        panel.add(lblalto, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 60, 140, 20));

        lblminas.setForeground(java.awt.SystemColor.controlShadow);
        lblminas.setText("Valor Máximo:");
        panel.add(lblminas, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 90, 140, 20));

        anc.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                ancKeyReleased(evt);
            }
        });
        panel.add(anc, new org.netbeans.lib.awtextra.AbsoluteConstraints(80, 30, 50, -1));

        alt.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                altKeyReleased(evt);
            }
        });
        panel.add(alt, new org.netbeans.lib.awtextra.AbsoluteConstraints(80, 60, 50, -1));

        min.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                minKeyReleased(evt);
            }
        });
        panel.add(min, new org.netbeans.lib.awtextra.AbsoluteConstraints(80, 90, 50, -1));

        lblporcentaje.setForeground(new java.awt.Color(153, 153, 153));
        lblporcentaje.setText("Porcentaje de Dificultad:");
        panel.add(lblporcentaje, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 130, 250, 20));

        Form_personalizar.getContentPane().add(panel, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 10, 290, 160));

        btnJugar.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        btnJugar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/minaBkn.png"))); // NOI18N
        btnJugar.setText("Jugar");
        btnJugar.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        btnJugar.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
        btnJugar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnJugarActionPerformed1(evt);
            }
        });
        Form_personalizar.getContentPane().add(btnJugar, new org.netbeans.lib.awtextra.AbsoluteConstraints(150, 170, 150, 40));

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Tabla de Puntajes"));
        jPanel1.setLayout(new java.awt.BorderLayout());

        tab.setAutoCreateRowSorter(true);
        tab.setBackground(new java.awt.Color(0, 0, 0));
        tab.setForeground(new java.awt.Color(255, 255, 51));
        tab.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Nombre", "Tiempo", "Nivel", "Cantidad de Minas"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tab.setEnabled(false);
        tab.setShowHorizontalLines(false);
        tab.setShowVerticalLines(false);
        jScrollPane1.setViewportView(tab);

        jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);

        dialogo_tiempos.getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        Form_tamaño.getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Tamaño Botones"));
        jPanel2.setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jLabel3.setText("Ancho:");
        jPanel2.add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(40, 30, -1, 20));

        jLabel5.setText("Alto:");
        jPanel2.add(jLabel5, new org.netbeans.lib.awtextra.AbsoluteConstraints(130, 30, -1, 20));
        jPanel2.add(anchocfg, new org.netbeans.lib.awtextra.AbsoluteConstraints(80, 30, 40, -1));
        jPanel2.add(altocfg, new org.netbeans.lib.awtextra.AbsoluteConstraints(160, 30, 40, -1));

        btnGuardar.setText("Guardar Cambios");
        btnGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGuardarActionPerformed(evt);
            }
        });
        jPanel2.add(btnGuardar, new org.netbeans.lib.awtextra.AbsoluteConstraints(40, 70, 170, -1));

        Form_tamaño.getContentPane().add(jPanel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 260, 120));

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosed(java.awt.event.WindowEvent evt) {
                formWindowClosed(evt);
            }
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });
        addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentResized(java.awt.event.ComponentEvent evt) {
                formComponentResized(evt);
            }
        });
        addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                formKeyReleased(evt);
            }
        });
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        jMenuBar1.setMinimumSize(new java.awt.Dimension(5, 21));

        jMenu1.setText("Juego");

        nuevoJuego.setText("Nuevo");
        nuevoJuego.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nuevoJuegoActionPerformed(evt);
            }
        });
        jMenu1.add(nuevoJuego);
        jMenu1.add(jSeparator1);

        jMenuItem2.setText("Abrir");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem2ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem2);

        menupausar.setText("Pausar");
        menupausar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menupausarActionPerformed(evt);
            }
        });
        jMenu1.add(menupausar);

        menuguardar.setText("Guardar");
        menuguardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menuguardarActionPerformed(evt);
            }
        });
        jMenu1.add(menuguardar);
        jMenu1.add(jSeparator3);

        nivelPrincipiante.setSelected(true);
        nivelPrincipiante.setText("Nivel Principiante");
        nivelPrincipiante.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nivelPrincipianteActionPerformed(evt);
            }
        });
        jMenu1.add(nivelPrincipiante);

        nivelIntermedio.setText("Nivel Intermedio");
        nivelIntermedio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nivelIntermedioActionPerformed(evt);
            }
        });
        jMenu1.add(nivelIntermedio);

        nivelExperto.setText("Nivel Experto");
        nivelExperto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nivelExpertoActionPerformed(evt);
            }
        });
        jMenu1.add(nivelExperto);

        personalizarJuego.setText("Personalizado");
        personalizarJuego.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                personalizarJuegoActionPerformed(evt);
            }
        });
        jMenu1.add(personalizarJuego);
        jMenu1.add(jSeparator2);

        tablaDeTiempos.setText("Tabla de Puntajes");
        tablaDeTiempos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tablaDeTiemposActionPerformed(evt);
            }
        });
        jMenu1.add(tablaDeTiempos);
        jMenu1.add(jSeparator4);

        jMenuItem3.setText("Salir");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem3ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem3);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Configuración");

        jMenuItem1.setText("Cambiar Tamaño");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem1);

        jMenuBar1.add(jMenu2);

        setJMenuBar(jMenuBar1);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void nuevoJuegoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nuevoJuegoActionPerformed
        eliminarLabels();
        iniciarJuego(10, 9, 9, "Principiante");
        h.setEstado(false);
        setEstadoNiveles(nivelPrincipiante);
    }//GEN-LAST:event_nuevoJuegoActionPerformed

    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
        Abrir a = new Abrir();
        if(a.abrir("jbms", "Abrir Partida", "/JbuscaMina/Partidas")){
            
            String n;

            ArchivoDesencriptado ardes = new ArchivoDesencriptado();
            ardes = desencriptar(a.getRuta());
            ArchivoDeConfiguracion ac = new ArchivoExistente(ardes.getRuta());


            int al, an, m, s, banderas;

            al = Integer.parseInt(ac.getValorDeConfiguracion("alto"));
            an = Integer.parseInt(ac.getValorDeConfiguracion("ancho"));
            s = Integer.parseInt(ac.getValorDeConfiguracion("segundos"));
            m = Integer.parseInt(ac.getValorDeConfiguracion("minas"));
            n = ac.getValorDeConfiguracion("nivel");

            
            
            String[][] tabVirtual = new String[al][an];
            int[][] t = new int[al][an];

            getTabVirtualPartidaGuardada(tabVirtual, Archivo.leerArchivo(ardes.getRuta()));
            getTabPartidaGuardada(t, Archivo.leerArchivo(ardes.getRuta()), al, an);
            banderas = getBanderasPartidaGuardada(Archivo.leerArchivo(ardes.getRuta()));

            new File(ardes.getRuta()).delete();
            iniciarJuegoGuardado(m, al, an, n, banderas, s, tabVirtual, t);
            System.out.println("Banderas: "+banderas);
            BuscaMina.imprimirTablero();
            System.out.println();
            System.out.println();
            BuscaMina.imprimirTableroAux();
        }
    }//GEN-LAST:event_jMenuItem2ActionPerformed

    private void btnGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGuardarActionPerformed
        cambiarTamañoBotones(Integer.parseInt(altocfg.getText()), Integer.parseInt(anchocfg.getText()));
        Form_tamaño.setVisible(false);
    }//GEN-LAST:event_btnGuardarActionPerformed

    private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
        this.formWindowClosing(null);
        System.exit(0);
    }//GEN-LAST:event_jMenuItem3ActionPerformed

    private void personalizarJuegoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_personalizarJuegoActionPerformed
        setAnchoAltoPantalla();
        Redimensionar.redimensionarFormulario(Form_personalizar, false, "Personalizar Juego");
        Form_personalizar.setBounds(Form_personalizar.getX(),Form_personalizar.getY(),(int)Form_personalizar.getPreferredSize().getWidth()+10,(int)Form_personalizar.getPreferredSize().getHeight()+10);
        anc.setText("9");
        alt.setText("9");
        min.setText("10");
        setLabelMaximoMinas();
        setLabelPorcentaje();
    }//GEN-LAST:event_personalizarJuegoActionPerformed

    private void btnJugarActionPerformed1(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnJugarActionPerformed1
        try{
            int m, a, l;
            m = Integer.parseInt(min.getText());
            a = Integer.parseInt(anc.getText());
            l = Integer.parseInt(alt.getText());

            if(m < 10 && a < 9 && l < 9){
                mensajes.Mensajes.mensajeError("Rango Mínimo Permitido: [9x9] con 10 minas (Nivel Principiante)");
                anc.setText("9");
                alt.setText("9");
                min.setText("10");
            }else if((a * l) < m){
                mensajes.Mensajes.mensajeError("Rango de Minas: 1 - "+(a * l));
            }else if(a > MAXIMO_ANCHO){
                mensajes.Mensajes.mensajeError("El ANCHO máximo que su Resolución le permite es de: "+MAXIMO_ANCHO);
            }else if(l > MAXIMO_ALTO){
                mensajes.Mensajes.mensajeError("El ALTO máximo que su Resolución le permite es de: "+MAXIMO_ALTO);
            }else{
                eliminarLabels();
                iniciarJuego(m, l, a, "Personalizado");
                Form_personalizar.setVisible(false);
                h.setEstado(false);
                setEstadoNiveles(false);
            }

        }catch(NumberFormatException e){
            mensajes.Mensajes.mensajeError("Sólo se aceptan Números");
        }
    }//GEN-LAST:event_btnJugarActionPerformed1

    private void nivelPrincipianteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nivelPrincipianteActionPerformed
        setEstadoNiveles(nivelPrincipiante);
    }//GEN-LAST:event_nivelPrincipianteActionPerformed

    private void nivelIntermedioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nivelIntermedioActionPerformed
        setEstadoNiveles(nivelIntermedio);
    }//GEN-LAST:event_nivelIntermedioActionPerformed

    private void nivelExpertoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nivelExpertoActionPerformed
        setEstadoNiveles(nivelExperto);
    }//GEN-LAST:event_nivelExpertoActionPerformed

    private void ancKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_ancKeyReleased
        setLabelPorcentaje();
        setLabelMaximoMinas();
    }//GEN-LAST:event_ancKeyReleased

    private void altKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_altKeyReleased
        setLabelPorcentaje();
        setLabelMaximoMinas();
    }//GEN-LAST:event_altKeyReleased

    private void formKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_formKeyReleased
        try{
            if(evt.getKeyCode() == KeyEvent.VK_BACK_SPACE){
                FRASE_TRUCO_1_A_COMPARAR = FRASE_TRUCO_1_A_COMPARAR.substring(0, FRASE_TRUCO_1_A_COMPARAR.length()-1);
                FRASE_NUEVO_JUEGO_A_COMPARAR = FRASE_NUEVO_JUEGO_A_COMPARAR.substring(0, FRASE_NUEVO_JUEGO_A_COMPARAR.length()-1);
            }else{
                FRASE_TRUCO_1_A_COMPARAR += evt.getKeyChar();
                FRASE_NUEVO_JUEGO_A_COMPARAR += evt.getKeyChar();
                if(FRASE_TRUCO_1_A_COMPARAR.equalsIgnoreCase(FRASE_TRUCO_1)){
                    activarTrucoKabum();
                }
                if(FRASE_NUEVO_JUEGO_A_COMPARAR.equalsIgnoreCase(FRASE_NUEVO_JUEGO)){
                    eliminarLabels();
                    iniciarJuego(10, 9, 9, "Principiante");
                    h.setEstado(false);
                    setEstadoNiveles(nivelPrincipiante);
                }
            }
        }catch(java.lang.StringIndexOutOfBoundsException e){
        
        }
    }//GEN-LAST:event_formKeyReleased

    private void tablaDeTiemposActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tablaDeTiemposActionPerformed
        new File(RUTA_ARCHIVO_TIEMPOS).setWritable(true);
        int op = mensajes.Mensajes.mensajePreguntaSiNo("¿Desea ver la tabla de Puntajes de Internet?");

        String[] enc = {"Posición", "Nombre", "Tiempo", "Nivel", "Minas", "Porcentaje de Dificultad", "PUNTAJE TOTAL"};
        int can = 0;
        int minutos, segundoS, horas;
        final int CODIGO = 0, PUNTAJE = 1;

        if(op == mensajes.Mensajes.no){
            can = Integer.parseInt(archivo_tiempo.getValorDeConfiguracion("cantidad"));
            tab.setModel(new javax.swing.table.DefaultTableModel(new Object[can][enc.length], enc));

            if(can != 0){
                int[][] puntajes = new int[can][2];

                for(int i=0; i<can; i++){
                    puntajes[i][CODIGO] = (i+1);
                    puntajes[i][PUNTAJE] = Integer.parseInt(archivo_tiempo.getValorDeConfiguracion("puntaje"+(i+1)));
                }

                ordenarPuntajes(puntajes);

                int i2=0;
                for(int i=puntajes.length-1;i>=0; i--){
                    tab.setValueAt((i2+1), i2, 0);
                    tab.setValueAt(archivo_tiempo.getValorDeConfiguracion("nombre"+(puntajes[i][CODIGO])), i2, 1);
                    horas = Integer.parseInt(archivo_tiempo.getValorDeConfiguracion("tiempo"+(puntajes[i][CODIGO]))) / 3600;
                    minutos = Integer.parseInt(archivo_tiempo.getValorDeConfiguracion("tiempo"+(puntajes[i][CODIGO]))) / 60;
                    segundoS = Integer.parseInt(archivo_tiempo.getValorDeConfiguracion("tiempo"+(puntajes[i][CODIGO]))) - (minutos * 60) - (horas * 3600);
                    tab.setValueAt(horas + "h, " +minutos+"m, "+segundoS + "s", i2, 2);
                    tab.setValueAt(archivo_tiempo.getValorDeConfiguracion("nivel"+(puntajes[i][CODIGO])), i2, 3);
                    tab.setValueAt(archivo_tiempo.getValorDeConfiguracion("minas"+(puntajes[i][CODIGO])), i2, 4);
                    tab.setValueAt(archivo_tiempo.getValorDeConfiguracion("porcentaje"+(puntajes[i][CODIGO])), i2, 5);
                    tab.setValueAt(archivo_tiempo.getValorDeConfiguracion("puntaje"+(puntajes[i][CODIGO])), i2, 6);
                    tab.setFont(new java.awt.Font("Tahoma", Font.BOLD, 14));

                    i2++;
                }
            }
        }else{
            try {
                //mensajes.Mensajes.mensajeInformacion("Por favor sea paciente. Se está intentando Conectar");
                Conexion.conectar();
                Conexion.sen = Conexion.con.createStatement();
                Conexion.rs = Conexion.sen.executeQuery("select count(*) as cantidad from puntaje");
                if(Conexion.rs.next()){
                    can = Conexion.rs.getInt("cantidad");
                }
                
                System.out.println("wea4");

                tab.setModel(new javax.swing.table.DefaultTableModel(new Object[can][enc.length], enc));

                if(can != 0){
                    int[][] puntajes = new int[can][2];
                    Conexion.rs.close();
                    Conexion.rs = Conexion.sen.executeQuery("select pun_pun as puntaje, cod_pun as cod from puntaje");

                    int i=0;
                    while(Conexion.rs.next()){
                        puntajes[i][CODIGO] = Conexion.rs.getInt("cod");
                        puntajes[i][PUNTAJE] = Conexion.rs.getInt("puntaje");
                        i++;
                    }


                    ordenarPuntajes(puntajes);

                    
                    int i2=0;
                    int tiempo;
                    for(i=puntajes.length-1;i>=0; i--){

                        
                        Conexion.sen = Conexion.con.createStatement();
                        Conexion.rs.close();
                        Conexion.rs = Conexion.sen.executeQuery("select * from puntaje where cod_pun = "+puntajes[i][CODIGO]);

                        if(Conexion.rs.next()){
                            tiempo = Conexion.rs.getInt("tie_pun");
                            tab.setValueAt((i2+1), i2, 0);
                            tab.setValueAt(Conexion.rs.getString("nom_pun"), i2, 1);
                            horas = tiempo / 3600;
                            minutos = tiempo / 60;
                            segundoS = tiempo - (minutos * 60) - (horas * 3600);
                            tab.setValueAt(horas + "h, " +minutos+"m, "+segundoS + "s", i2, 2);
                            tab.setValueAt(Conexion.rs.getString("niv_pun"), i2, 3);
                            tab.setValueAt(Conexion.rs.getString("min_pun"), i2, 4);
                            tab.setValueAt(Conexion.rs.getString("por_pun")+"%", i2, 5);
                            tab.setValueAt(Conexion.rs.getString("pun_pun"), i2, 6);
                            tab.setFont(new java.awt.Font("Tahoma", Font.BOLD, 14));
                        }
                        
                        i2++;
                    }
                }
                Conexion.sen.close();
            } catch (SQLException ex) {
                mensajes.Mensajes.mensajeError(ex.getMessage());
            }

        }
        Redimensionar.redimensionarFormulario(dialogo_tiempos, true, "Puntajes"+(op == mensajes.Mensajes.no ? " Locales":" Mundiales"));
        Archivo.setArchivoSoloLectura(RUTA_ARCHIVO_TIEMPOS);
    }//GEN-LAST:event_tablaDeTiemposActionPerformed

    private void minKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_minKeyReleased
        setLabelPorcentaje();
    }//GEN-LAST:event_minKeyReleased

    private void menuguardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuguardarActionPerformed
        h.setEstado(false);
        Guardar g = new Guardar();
        String linea = "";
        if(g.guardarComo(Fecha.getFecha(true, false), "jbms", "Guardar Partida", "/JbuscaMina/Partidas")){
//            try {
                String ruta = g.getRuta();

                escribirEnArchivo(ruta, "tab", false);
                
                for(int i=0; i<BuscaMina.getTab().length;i++){
                    for(int j=0; j<BuscaMina.getTab()[i].length;j++){
                        linea += BuscaMina.getTab()[i][j]+" ";
                    }
                    escribirEnArchivo(ruta,linea, false);
                    linea = "";
                }

                escribirEnArchivo(ruta, "tab_aux", false);
                for(int i=0; i<BuscaMina.getTabVirtual().length;i++){
                    for(int j=0; j<BuscaMina.getTabVirtual()[i].length;j++){
                        linea += BuscaMina.getTabVirtual()[i][j]+" ";
                    }
                    escribirEnArchivo(ruta, linea, false);
                    linea = "";
                }

                escribirEnArchivo(ruta, "alto="+ALTO, false);
                escribirEnArchivo(ruta, "ancho="+ANCHO, false);
                escribirEnArchivo(ruta, "nivel="+NIVEL, false);
                escribirEnArchivo(ruta, "segundos="+(h.getSegundos() == 0 ? h.getSegundos(): h.getSegundos()-1), false);
                escribirEnArchivo(ruta, "minas="+CANTIDAD_DE_MINAS, false);


                
                Archivo.setArchivoSoloLectura(ruta);
//            } catch (IOException ex) {
//                Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
//            }
        }
        if(h.getSegundos() != 0){
            h.setEstado(true);
        }

    }//GEN-LAST:event_menuguardarActionPerformed

    private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed

    }//GEN-LAST:event_formWindowClosed

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
//        try {
            String linea = "";
            escribirEnArchivo(RUTA_ARCHIVO_GUARDADO_AUTOMATICO, "tab", true);
            for(int i=0; i<BuscaMina.getTab().length;i++){
                for(int j=0; j<BuscaMina.getTab()[i].length;j++){
                    linea += BuscaMina.getTab()[i][j]+" ";
                }
                escribirEnArchivo(RUTA_ARCHIVO_GUARDADO_AUTOMATICO, linea, false);
                linea = "";
            }

            escribirEnArchivo(RUTA_ARCHIVO_GUARDADO_AUTOMATICO, "tab_aux", false);
            for(int i=0; i<BuscaMina.getTabVirtual().length;i++){
                for(int j=0; j<BuscaMina.getTabVirtual()[i].length;j++){
                    linea += BuscaMina.getTabVirtual()[i][j]+" ";
                }
                escribirEnArchivo(RUTA_ARCHIVO_GUARDADO_AUTOMATICO, linea, false);
                linea = "";
            }

            escribirEnArchivo(RUTA_ARCHIVO_GUARDADO_AUTOMATICO, "alto="+ALTO, false);
            escribirEnArchivo(RUTA_ARCHIVO_GUARDADO_AUTOMATICO, "ancho="+ANCHO, false);
            escribirEnArchivo(RUTA_ARCHIVO_GUARDADO_AUTOMATICO, "nivel="+NIVEL, false);
            escribirEnArchivo(RUTA_ARCHIVO_GUARDADO_AUTOMATICO, "segundos="+(h.getSegundos() == 0 ? h.getSegundos(): h.getSegundos()-1), false);
            escribirEnArchivo(RUTA_ARCHIVO_GUARDADO_AUTOMATICO, "minas="+CANTIDAD_DE_MINAS, false);
//        } catch (IOException ex) {
//            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
//        }
    }//GEN-LAST:event_formWindowClosing

    private void menupausarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menupausarActionPerformed
        h.setEstado(false);
        menupausar.setEnabled(false);
    }//GEN-LAST:event_menupausarActionPerformed

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        anchocfg.setText("");
        altocfg.setText("");
        Redimensionar.redimensionarFormulario(Form_tamaño, false, "Configuración del Tamaño");
        Form_tamaño.setBounds(Form_tamaño.getX(),Form_tamaño.getY(),(int)Form_tamaño.getPreferredSize().getWidth()+3,(int)Form_tamaño.getPreferredSize().getHeight()+3);
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized
//        if(this.getWidth() - WIDTHFORM > 0 && this.getHeight() - HEIGHTFORM > 0){
//            int diferenciaW = this.getWidth() - WIDTHFORM;
//            int diferenciaH = this.getHeight() - HEIGHTFORM;
//
//            diferenciaW = diferenciaW / ANCHO;
//            diferenciaH = diferenciaH / ALTO;
//
//            WIDTHFORM = this.getWidth();
//            HEIGHTFORM = this.getHeight();
//            this.cambiarTamañoBotones(ALTO_BOTON+diferenciaH, ANCHO_BOTON+diferenciaW);
//        }else if(this.getWidth() - WIDTHFORM != 0 && this.getHeight() - HEIGHTFORM != 0){
//            int diferenciaW =  WIDTHFORM - this.getWidth();
//            int diferenciaH =  HEIGHTFORM - this.getHeight() ;
//
//            diferenciaW = diferenciaW / ANCHO;
//            diferenciaH = diferenciaH / ALTO;
//
//            WIDTHFORM = this.getWidth();
//            HEIGHTFORM = this.getHeight();
//            this.cambiarTamañoBotones(ALTO_BOTON-diferenciaH, ANCHO_BOTON-diferenciaW);
//        }
    }//GEN-LAST:event_formComponentResized

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
//        try {
//            javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());
//        } catch (ClassNotFoundException ex) {
//            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (InstantiationException ex) {
//            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (IllegalAccessException ex) {
//            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
//        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
//            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
//        }
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Aplicacion().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JFrame Form_personalizar;
    private javax.swing.JFrame Form_tamaño;
    private javax.swing.JTextField alt;
    private javax.swing.JTextField altocfg;
    private javax.swing.JTextField anc;
    private javax.swing.JTextField anchocfg;
    private javax.swing.JButton btnGuardar;
    private javax.swing.JButton btnJugar;
    private javax.swing.JDialog dialogo_tiempos;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JPopupMenu.Separator jSeparator2;
    private javax.swing.JPopupMenu.Separator jSeparator3;
    private javax.swing.JPopupMenu.Separator jSeparator4;
    private javax.swing.JLabel lblalto;
    private javax.swing.JLabel lblancho;
    private javax.swing.JLabel lblminas;
    private javax.swing.JLabel lblporcentaje;
    private javax.swing.JMenuItem menuguardar;
    private javax.swing.JMenuItem menupausar;
    private javax.swing.JTextField min;
    private javax.swing.JCheckBoxMenuItem nivelExperto;
    private javax.swing.JCheckBoxMenuItem nivelIntermedio;
    private javax.swing.JCheckBoxMenuItem nivelPrincipiante;
    private javax.swing.JMenuItem nuevoJuego;
    private javax.swing.JPanel panel;
    private javax.swing.JMenuItem personalizarJuego;
    private javax.swing.JTable tab;
    private javax.swing.JMenuItem tablaDeTiempos;
    // End of variables declaration//GEN-END:variables

    private void pintarLabels(int x, int y) {
        int puntoX, puntoY;

        puntoX = PUNTO_DE_INICIO_X;
        puntoY = PUNTO_DE_INICIO_Y;
        labels = new javax.swing.JLabel[x][y];

        inicialiarLabel(labels);

        for(int i=0;i<x;i++){
            for(int j=0;j<y;j++){
                labels[i][j].setDoubleBuffered(true);
                labels[i][j].setFont(new java.awt.Font("Tahoma", 1, TAMAÑO_NUMEROS));
                labels[i][j].setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
                labels[i][j].setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
                getContentPane().add(labels[i][j], new org.netbeans.lib.awtextra.AbsoluteConstraints(puntoX, puntoY, ANCHO_BOTON, ALTO_BOTON));

                labels[i][j].setName("l_"+i+"_"+j+"");
                if(j == (y-1)){
                    puntoX = PUNTO_DE_INICIO_X;
                    puntoY += ALTO_BOTON;
                }else{
                    puntoX += ANCHO_BOTON;
                }

                /*---------------------------------------------------------------------*/
                /*AGREGANDO EL MOUSE LISTENER*/
                /*---------------------------------------------------------------------*/

                labels[i][j].addMouseListener(new java.awt.event.MouseAdapter() {

                    @Override
                    public void mousePressed(java.awt.event.MouseEvent evt) {
                        labelsMousePressed(evt);
                    }

                    private void labelsMousePressed(MouseEvent evt) {
                       monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_risa.PNG")));
                    }
                });

                labels[i][j].addMouseListener(new java.awt.event.MouseAdapter() {

                    @Override
                    public void mouseClicked(java.awt.event.MouseEvent evt) {
                        labelsMouseClicked(evt);
                    }

                    private void labelsMouseClicked(MouseEvent evt) {
                        monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_normal.PNG")));
                    }
                });
                labels[i][j].addMouseListener(new java.awt.event.MouseAdapter() {

                    @Override
                    public void mouseReleased(java.awt.event.MouseEvent evt) {
                        labelsMouseReleased(evt);
                        //BuscaMina.imprimirTableroAux();
                    }



                    private void labelsMouseReleased(MouseEvent evt) {
                        menupausar.setEnabled(true);
                        h.setEstado(true);
                        Punto p = getXy(evt);
                        int x, y;
                        x = p.getX();
                        y = p.getY();

                        if(!h.isEstado()){
                            h.setEstado(true);
                            h.setCont(1);
                        }

                        if (evt.getButton() != MouseEvent.BUTTON3) {//si el boton es distino del boton derecho
                            try{
                                if(!BuscaMina.getNombreIcono(labels[x][y].getIcon().toString()).equalsIgnoreCase("bandera")){
                                    jugarCasilla(x,y);
                                }
                            }catch(NullPointerException e){
                                if(!labels[x][y].getText().equalsIgnoreCase("?")){
                                    jugarCasilla(x,y);
                                }
                            }
                        } else {
                            if (!(labels[x][y].getBorder()instanceof EtchedBorder))  {
                                if (labels[x][y].getIcon() != null) {//si esta el icono de bandera
                                    labels[x][y].setIcon(null);
                                    labels[x][y].setForeground(Color.red);
                                    labels[x][y].setText("?");
                                    BuscaMina.setPosicionTabAux(x, y, BuscaMina.SIGNO_PREGUNTA);
                                    CANTIDAD_DE_MINAS_LABEL++;
                                    setContMinas();
                                } else if (labels[x][y].getText().equalsIgnoreCase("?")) {
                                    BuscaMina.setPosicionTabAux(x, y, BuscaMina.NO_JUGADO);
                                    labels[x][y].setForeground(Color.red);
                                    labels[x][y].setText("");
                                } else {
                                    BuscaMina.setPosicionTabAux(x, y, BuscaMina.BANDERA);
                                    labels[x][y].setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/bandera.PNG")));
                                    CANTIDAD_DE_MINAS_LABEL--;
                                    setContMinas();
                                    
                                }

                            }
                            if(CANTIDAD_DE_MINAS_LABEL == 0){
                                if(verificarGanador()){
                                    h.setEstado(false);
                                    guardarDatosEnArchivoTiempo();
                                    BuscaMina.deshabilitarLabels(labels);
                                }
                            }
                        }
                    }

                    private Punto getXy(MouseEvent evt) {
                        int x, y;
                        String[] numeros;
                        Punto p = new Punto();

                        numeros = (((evt.getComponent().getName().replaceAll("l", "")).replaceAll("_", " ")).trim()).split(" ");

                        x = Integer.parseInt(numeros[0]);
                        y = Integer.parseInt(numeros[1]);

                        p.setX(x);
                        p.setY(y);

                        return p;
                    }

                    

                    
                });
            }
        }
        lbl_nivel = new JLabel(NIVEL);
        lbl_nivel.setFont(new java.awt.Font("Tahoma", 1, 11));
        lbl_nivel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        lbl_nivel.setToolTipText("Porcentaje de Dificultad: "+PORCENTAJE_DIFICULTAD+"%");
        getContentPane().add(lbl_nivel, new org.netbeans.lib.awtextra.AbsoluteConstraints(puntoX, puntoY, ANCHO*17,15));
    }

    private void pintarLabelsPartidaGuardada(int x, int y) {
        int puntoX, puntoY;

        puntoX = PUNTO_DE_INICIO_X;
        puntoY = PUNTO_DE_INICIO_Y;
        labels = new javax.swing.JLabel[x][y];

        inicialiarLabel(labels);
        for(int i=0;i<x;i++){
            for(int j=0;j<y;j++){
                labels[i][j].setFont(new java.awt.Font("Tahoma", 1, TAMAÑO_NUMEROS));
                labels[i][j].setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
                labels[i][j].setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));

                if(BuscaMina.getTabVirtual()[i][j].equalsIgnoreCase(BuscaMina.BANDERA)){
                    labels[i][j].setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/bandera.PNG")));
                }else if(BuscaMina.getTabVirtual()[i][j].equalsIgnoreCase(BuscaMina.JUGADO)){
                    labels[i][j].setBorder(javax.swing.BorderFactory.createEtchedBorder());
                    cambiarColorNumero(BuscaMina.getTab()[i][j], labels[i][j]);
                    labels[i][j].setText((Integer.toString(BuscaMina.getTab()[i][j]).equalsIgnoreCase("0") ? "": Integer.toString(BuscaMina.getTab()[i][j])));
                }else if(BuscaMina.getTabVirtual()[i][j].equalsIgnoreCase(BuscaMina.SIGNO_PREGUNTA)){
                    labels[i][j].setForeground(Color.red);
                    labels[i][j].setText("?");
                }else if(BuscaMina.getTabVirtual()[i][j].equalsIgnoreCase(BuscaMina.NO_JUGADO)){
                    labels[i][j].setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
                }

                cambiarColorNumero(BuscaMina.getPosicion(i, j), labels[i][j]);
                getContentPane().add(labels[i][j], new org.netbeans.lib.awtextra.AbsoluteConstraints(puntoX, puntoY, ANCHO_BOTON, ALTO_BOTON));

                labels[i][j].setName("l_"+i+"_"+j+"");
                if(j == (y-1)){
                    puntoX = PUNTO_DE_INICIO_X;
                    puntoY += ALTO_BOTON;
                }else{
                    puntoX += ANCHO_BOTON;
                }

                /*---------------------------------------------------------------------*/
                /*AGREGANDO EL MOUSE LISTENER*/
                /*---------------------------------------------------------------------*/

                labels[i][j].addMouseListener(new java.awt.event.MouseAdapter() {

                    @Override
                    public void mousePressed(java.awt.event.MouseEvent evt) {
                        labelsMousePressed(evt);
                    }

                    private void labelsMousePressed(MouseEvent evt) {
                       monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_risa.PNG")));
                    }
                });

                labels[i][j].addMouseListener(new java.awt.event.MouseAdapter() {

                    @Override
                    public void mouseClicked(java.awt.event.MouseEvent evt) {
                        labelsMouseClicked(evt);
                    }

                    private void labelsMouseClicked(MouseEvent evt) {
                        monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_normal.PNG")));
                    }
                });
                labels[i][j].addMouseListener(new java.awt.event.MouseAdapter() {

                    @Override
                    public void mouseReleased(java.awt.event.MouseEvent evt) {
                        labelsMouseReleased(evt);
//                        BuscaMina.imprimirTableroAux();
                    }



                    private void labelsMouseReleased(MouseEvent evt) {
                        menupausar.setEnabled(true);
                        h.setEstado(true);
                        Punto p = getXy(evt);
                        int x, y;
                        x = p.getX();
                        y = p.getY();

                        if(!h.isEstado()){
                            h.setEstado(true);
                        }

                        if (evt.getButton() != MouseEvent.BUTTON3) {//si el boton es distino del boton derecho
                            try{
                                if(!BuscaMina.getNombreIcono(labels[x][y].getIcon().toString()).equalsIgnoreCase("bandera")){
                                    jugarCasilla(x,y);
                                }
                            }catch(NullPointerException e){
                                if(!labels[x][y].getText().equalsIgnoreCase("?")){
                                    jugarCasilla(x,y);
                                }
                            }
                        } else {
                            if (!(labels[x][y].getBorder()instanceof EtchedBorder))  {
                                if (labels[x][y].getIcon() != null) {//si esta el icono de bandera
                                    labels[x][y].setIcon(null);
                                    labels[x][y].setForeground(Color.red);
                                    labels[x][y].setText("?");
                                    BuscaMina.setPosicionTabAux(x, y, BuscaMina.SIGNO_PREGUNTA);
                                    CANTIDAD_DE_MINAS_LABEL++;
                                    setContMinas();
                                } else if (labels[x][y].getText().equalsIgnoreCase("?")) {
                                    BuscaMina.setPosicionTabAux(x, y, BuscaMina.NO_JUGADO);
                                    labels[x][y].setForeground(Color.red);
                                    labels[x][y].setText("");
                                } else {
                                    BuscaMina.setPosicionTabAux(x, y, BuscaMina.BANDERA);
                                    labels[x][y].setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/bandera.PNG")));
                                    CANTIDAD_DE_MINAS_LABEL--;
                                    setContMinas();
                                    
                                }
                                if(CANTIDAD_DE_MINAS_LABEL == 0){
                                    if(verificarGanador()){
                                        h.setEstado(false);
                                        guardarDatosEnArchivoTiempo();
                                        BuscaMina.deshabilitarLabels(labels);
                                    }
                                }
                            }
                        }
                    }

                    private Punto getXy(MouseEvent evt) {
                        int x, y;
                        String[] numeros;
                        Punto p = new Punto();

                        numeros = (((evt.getComponent().getName().replaceAll("l", "")).replaceAll("_", " ")).trim()).split(" ");

                        x = Integer.parseInt(numeros[0]);
                        y = Integer.parseInt(numeros[1]);

                        p.setX(x);
                        p.setY(y);

                        return p;
                    }




                });
            }
        }
        lbl_nivel = new JLabel(NIVEL);
        lbl_nivel.setFont(new java.awt.Font("Tahoma", 1, 11));
        lbl_nivel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        lbl_nivel.setToolTipText("Porcentaje de Dificultad: "+PORCENTAJE_DIFICULTAD+"%");
        getContentPane().add(lbl_nivel, new org.netbeans.lib.awtextra.AbsoluteConstraints(puntoX, puntoY, ANCHO*17,15));
    }

    private void cambiarColorNumero(int posicion, JLabel lbl) {
        switch (posicion) {
            case 1: {
                lbl.setForeground(Color.BLUE);
                break;
            }
            case 2: {
                lbl.setForeground(new Color(0,153,0));
                break;
            }
            case 3: {
                lbl.setForeground(Color.RED);
                break;
            }
            case 4: {
                lbl.setForeground(Color.MAGENTA);
                break;
            }
            case 5: {
                lbl.setForeground(Color.ORANGE);
                break;
            }
            case 6: {
                lbl.setForeground(Color.PINK);
                break;
            }
            case 7: {
                lbl.setForeground(Color.BLUE);
                break;
            }
            case 8: {
                lbl.setForeground(Color.GREEN);
                break;
            }
            default:{

            }
        }
//        lbl.setOpaque(true);
//        lbl.setBackground(new Color(204,204,204));
    }

    private void jugarCasilla(int x, int y) {
        
        labels[x][y].setBorder(javax.swing.BorderFactory.createEtchedBorder());
        int posicion = BuscaMina.getPosicion(x, y);

        cambiarColorNumero(posicion, labels[x][y]);

        if (posicion == BuscaMina.MINA) {
            estallarMinas();
        } else {
            if(posicion == 0){
                int[][] tab2 = null;
                try {
                    tab2 = clases.EmptyFinder2.getEspaciosVacios(BuscaMina.getTab(), y, x, 1000);
                } catch (InterruptedException ex) {
                    Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
                }
                for(int i=0;i<tab2.length;i++){
                    for(int j=0;j<tab2[0].length;j++){
                        if(tab2[i][j] == EmptyFinder.ESPACIO_VACIO || tab2[i][j] == EmptyFinder.NUMERO_BORDE){
                            if(labels[i][j].getIcon() == null){
                                BuscaMina.setPosicionTabAux(i, j, BuscaMina.JUGADO);
                                labels[i][j].setText((BuscaMina.getPosicion(i, j) == 0 ? "": Integer.toString(BuscaMina.getPosicion(i, j))));
                                labels[i][j].setBorder(javax.swing.BorderFactory.createEtchedBorder());
                                cambiarColorNumero(BuscaMina.getPosicion(i, j), labels[i][j]);
                            }
                            this.repaint(labels[i][j].getX(), labels[i][j].getY(), this.ANCHO_BOTON, this.ALTO_BOTON);
                        }
                    }
                }
            }else{
                BuscaMina.setPosicionTabAux(x, y, BuscaMina.JUGADO);
                labels[x][y].setIcon(null);
                labels[x][y].setText((posicion != 0 ? Integer.toString(posicion) : ""));
            }

        }
        cambiarColorNumero(posicion, labels[x][y]);
    }

    private void inicialiarLabel(JLabel[][] labels) {
        for(int i=0;i<labels.length;i++){
            for(int j=0;j<labels[0].length;j++){
                labels[i][j] = new JLabel();
            }
        }
    }

    private void iniciarJuego(int cantidadDeMinas, int alto, int ancho, String nivel) {
        menupausar.setEnabled(false);
        NIVEL = "Nivel "+nivel+" ("+ancho+"x"+alto+")";
//        ALTO_BOTON = 17;
//        ANCHO_BOTON = 17;
        System.out.println(this.isVisible());

        TAMAÑO_NUMEROS = (ALTO_BOTON > ANCHO_BOTON ? ANCHO_BOTON-2 : (ALTO_BOTON < ANCHO_BOTON ? ALTO_BOTON-2 : ALTO_BOTON-2));
        ANCHO = ancho;
        ALTO = alto;
        CANTIDAD_DE_MINAS = cantidadDeMinas;
        CANTIDAD_DE_MINAS_AUX = cantidadDeMinas;
        CANTIDAD_DE_MINAS_LABEL = cantidadDeMinas;
        PUNTO_DE_INICIO_X = 0;
        PUNTO_DE_INICIO_Y = 40;
        CONTADOR_BANDERAS = 0;
        PORCENTAJE_DIFICULTAD = (CANTIDAD_DE_MINAS * 100) / (ANCHO * ALTO);
        inicializarPalabrasOcultas();

        pintarLabels(ALTO,ANCHO);
        Redimensionar.redimensionarFormulario(this, false, TITULO);
        BuscaMina.inicializarTablero(CANTIDAD_DE_MINAS, ALTO, ANCHO);
//        BuscaMina.imprimirTablero();

        segundos = new JLabel();
        segundos.setText("0000");
        segundos.setOpaque(true);
        segundos.setBackground(Color.BLACK);
        segundos.setForeground(Color.red);
        segundos.setFont(new java.awt.Font("Tahoma", 1, 18));
        segundos.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        segundos.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        getContentPane().add(segundos, new org.netbeans.lib.awtextra.AbsoluteConstraints(this.getWidth()-64, 8, 60, 25));

        contMinas = new JLabel();
        contMinas.setOpaque(true);
        contMinas.setBackground(Color.BLACK);
        contMinas.setForeground(Color.red);
        contMinas.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        contMinas.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        contMinas.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
//        contMinas.setText((CANTIDAD_DE_MINAS_AUX2 < 0 ? "-": "")+(CANTIDAD_DE_MINAS_AUX2 < 10 ? "000": (CANTIDAD_DE_MINAS_AUX2 < 100 ? "00": (CANTIDAD_DE_MINAS_AUX2 < 1000 ? "0":"")))+Integer.toString(Math.abs(CANTIDAD_DE_MINAS_AUX2)));
        setContMinas();
        getContentPane().add(contMinas, new org.netbeans.lib.awtextra.AbsoluteConstraints(3, 8, 60, 25));


        monito = new JLabel();
        monito.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        getContentPane().add(monito, new org.netbeans.lib.awtextra.AbsoluteConstraints((this.getWidth() / 2)-12, 8, 25, 25));
        monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_normal.PNG")));

        monito.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mousePressed(java.awt.event.MouseEvent evt) {
                monitoMousePressed(evt);
            }

            private void monitoMousePressed(MouseEvent evt) {
                if(evt.getButton() == MouseEvent.BUTTON1){
                    monito.setBorder(javax.swing.BorderFactory.createEtchedBorder());
                    monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_risa.PNG")));
                }
            }
        });

        monito.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                monitoMouseClicked(evt);
            }

            private void monitoMouseClicked(MouseEvent evt) {
                monito.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
                monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_normal.PNG")));
                
            }

        });

        monito.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                monitoMouseReleased(evt);
            }

            private void monitoMouseReleased(MouseEvent evt) {
                eliminarLabels();
                if(nivelPrincipiante.isSelected()){
                    iniciarJuego(CANTIDAD_DE_MINAS_AUX, ALTO, ANCHO, "Principiante");
                }else if(nivelIntermedio.isSelected()){
                    iniciarJuego(CANTIDAD_DE_MINAS_AUX, ALTO, ANCHO, "Intermedio");
                }else if(nivelExperto.isSelected()){
                    iniciarJuego(CANTIDAD_DE_MINAS_AUX, ALTO, ANCHO, "Experto");
                }else{
                    iniciarJuego(CANTIDAD_DE_MINAS_AUX, ALTO, ANCHO, "Personalizado");
                }
                h.setCont(0);
                h.setEstado(false);
            }

        });
        menuguardar.setEnabled(true);
    }

    private void iniciarJuegoGuardado(int cantidadDeMinas, int alto, int ancho, String nivel, int banderas, int seg, String[][] tabVirtual, int[][]tab) {
        menupausar.setEnabled(false);
        nivelPrincipiante.setSelected(false);
        nivelIntermedio.setSelected(false);
        nivelExperto.setSelected(false);
        personalizarJuego.setSelected(false);
        eliminarLabels();
        NIVEL = nivel;
//        ALTO_BOTON = 17;
//        ANCHO_BOTON = 17;
        TAMAÑO_NUMEROS = (ALTO_BOTON > ANCHO_BOTON ? ANCHO_BOTON-2 : (ALTO_BOTON < ANCHO_BOTON ? ALTO_BOTON-2 : ALTO_BOTON-2));
        ANCHO = ancho;
        ALTO = alto;
        CANTIDAD_DE_MINAS = cantidadDeMinas;
        CANTIDAD_DE_MINAS_AUX = cantidadDeMinas;
        CANTIDAD_DE_MINAS_LABEL = cantidadDeMinas-banderas;
        PUNTO_DE_INICIO_X = 0;
        PUNTO_DE_INICIO_Y = 40;
        CONTADOR_BANDERAS = banderas;
        PORCENTAJE_DIFICULTAD = (CANTIDAD_DE_MINAS * 100) / (ANCHO * ALTO);
        inicializarPalabrasOcultas();

        BuscaMina.setTab(tab);
        BuscaMina.setTabVirtual(tabVirtual);

        this.pintarLabelsPartidaGuardada(ALTO, ANCHO);
        Redimensionar.redimensionarFormulario(this, false, TITULO);
//        BuscaMina.imprimirTablero();

        h.setCont(seg);
        segundos = new JLabel();
        segundos.setOpaque(true);
        segundos.setBackground(Color.BLACK);
        segundos.setForeground(Color.red);
        segundos.setText((seg < 10 ? "000": (seg < 100 ? "00": (seg < 1000 ? "0":"")))+Integer.toString(seg));
        segundos.setFont(new java.awt.Font("Tahoma", 1, 18));
        segundos.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        segundos.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        getContentPane().add(segundos, new org.netbeans.lib.awtextra.AbsoluteConstraints(this.getWidth()-64, 8, 60, 25));

        contMinas = new JLabel();
        contMinas.setOpaque(true);
        contMinas.setBackground(Color.BLACK);
        contMinas.setForeground(Color.red);
        contMinas.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        contMinas.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        contMinas.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
//        contMinas.setText((CANTIDAD_DE_MINAS_AUX2 < 0 ? "-": "")+(CANTIDAD_DE_MINAS_AUX2 < 10 ? "000": (CANTIDAD_DE_MINAS_AUX2 < 100 ? "00": (CANTIDAD_DE_MINAS_AUX2 < 1000 ? "0":"")))+Integer.toString(Math.abs(CANTIDAD_DE_MINAS_AUX2)));
        setContMinas();
        getContentPane().add(contMinas, new org.netbeans.lib.awtextra.AbsoluteConstraints(3, 8, 60, 25));


        monito = new JLabel();
        monito.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        getContentPane().add(monito, new org.netbeans.lib.awtextra.AbsoluteConstraints((this.getWidth() / 2)-12, 8, 25, 25));
        monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_normal.PNG")));

        monito.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mousePressed(java.awt.event.MouseEvent evt) {
                monitoMousePressed(evt);
            }

            private void monitoMousePressed(MouseEvent evt) {
                if(evt.getButton() == MouseEvent.BUTTON1){
                    monito.setBorder(javax.swing.BorderFactory.createEtchedBorder());
                    monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_risa.PNG")));
                }
            }
        });

        monito.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                monitoMouseClicked(evt);
            }

            private void monitoMouseClicked(MouseEvent evt) {
                monito.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
                monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_normal.PNG")));

            }

        });

        monito.addMouseListener(new java.awt.event.MouseAdapter() {
            @Override
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                monitoMouseReleased(evt);
            }

            private void monitoMouseReleased(MouseEvent evt) {
                eliminarLabels();
                if(nivelPrincipiante.isSelected()){
                    iniciarJuego(CANTIDAD_DE_MINAS_AUX, ALTO, ANCHO, "Principiante");
                }else if(nivelIntermedio.isSelected()){
                    iniciarJuego(CANTIDAD_DE_MINAS_AUX, ALTO, ANCHO, "Intermedio");
                }else if(nivelExperto.isSelected()){
                    iniciarJuego(CANTIDAD_DE_MINAS_AUX, ALTO, ANCHO, "Experto");
                }else{
                    iniciarJuego(CANTIDAD_DE_MINAS_AUX, ALTO, ANCHO, "Personalizado");
                }
                h.setCont(0);
                h.setEstado(false);
            }

        });
        if(verificarGanador()){
            h.setEstado(false);
            BuscaMina.deshabilitarLabels(labels);
        }
        menuguardar.setEnabled(true);
    }

    private void eliminarLabels() {
        for(int i=0; i<labels.length; i++){
            for(int j=0; j<labels[i].length; j++){
                this.remove(labels[i][j]);
            }
        }
        remove(monito);
        remove(contMinas);
        remove(segundos);
        remove(lbl_nivel);
        this.repaint();
    }

    private void setEstadoNiveles(JCheckBoxMenuItem ch) {
        eliminarLabels();
        ch.setSelected(true);
        if(ch.getText().equalsIgnoreCase("nivel Principiante")){
            nivelIntermedio.setSelected(false);
            nivelExperto.setSelected(false);
            iniciarJuego(10, 9, 9, "Principiante");
        }else if(ch.getText().equalsIgnoreCase("nivel Intermedio")){
            nivelPrincipiante.setSelected(false);
            nivelExperto.setSelected(false);
            iniciarJuego(40, 16, 16, "Intermedio");
        }else if(ch.getText().equalsIgnoreCase("Nivel Experto")){
            nivelPrincipiante.setSelected(false);
            nivelIntermedio.setSelected(false);
            iniciarJuego(99, 16, 30, "Experto");
        }
        
        h.setEstado(false);
    }

    private void setEstadoNiveles(boolean e) {
        nivelPrincipiante.setSelected(e);
        nivelIntermedio.setSelected(e);
        nivelExperto.setSelected(e);
    }

    private void setAnchoAltoPantalla() {
        Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
        ALTO_PANTALLA = (int) d.getHeight();
        ANCHO_PANTALLA = (int) d.getWidth();

        MAXIMO_ANCHO = (ANCHO_PANTALLA / ANCHO_BOTON)-5;
        MAXIMO_ALTO = (ALTO_PANTALLA / ALTO_BOTON)-10;

        lblancho.setText("Valor Maximo: "+(MAXIMO_ANCHO));
        lblalto.setText("Valor Máximo: "+(MAXIMO_ALTO));
    }

    private void setLabelMaximoMinas() {
        try{
            int ancho, alto, resul;
            ancho = Integer.parseInt(anc.getText().trim());
            alto = Integer.parseInt(alt.getText().trim());
            resul = (ancho * alto);
            lblminas.setText("Valor Máximo: "+(resul < 0 ? "" : resul));
        }catch(NumberFormatException e){
            lblminas.setText("Valor Máximo: ");
        }
    }

    private void activarTrucoKabum() {
        TRUCO = true;
        int posicion;
        for(int i=0; i<labels.length; i++){
            for(int j = 0; j<labels[0].length; j++){
                labels[i][j].setBorder(javax.swing.BorderFactory.createEtchedBorder());
                posicion = BuscaMina.getPosicion(i, j);

                cambiarColorNumero(posicion, labels[i][j]);

                if (posicion == BuscaMina.MINA) {
                    labels[i][j].setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/mina.PNG")));
                } else {
                    if(posicion == 0){
                        labels[i][j].setText("");
                    }else{
                        labels[i][j].setIcon(null);
                        labels[i][j].setText((posicion != 0 ? Integer.toString(posicion) : ""));
                    }

                }
                cambiarColorNumero(posicion, labels[i][j]);
            }
        }
        BuscaMina.deshabilitarLabels(labels);
        h.setEstado(false);
        inicializarPalabrasOcultas();

        guardarDatosEnArchivoTiempo();

        BuscaMina.deshabilitarLabels(labels);
        setContMinas();
        menuguardar.setEnabled(false);
    }

    private boolean verificarGanador() {
        CONTADOR_BANDERAS = 0;
        for(int i=0;i<BuscaMina.getTab().length;i++){
            for(int j=0;j<BuscaMina.getTab()[0].length;j++){
                if(labels[i][j].getIcon() != null){
                    if(BuscaMina.getNombreIcono(labels[i][j].getIcon().toString()).equalsIgnoreCase("bandera") && BuscaMina.getTab()[i][j] == BuscaMina.MINA){
                        CONTADOR_BANDERAS++;
                    }
                }
            }
        }
        setContMinas();
        if(CONTADOR_BANDERAS == CANTIDAD_DE_MINAS){
            menuguardar.setEnabled(false);
            return true;
        }else{
            return false;
        }
//
    }

    private void inicializarPalabrasOcultas() {
        FRASE_TRUCO_1 = "kabum";
        FRASE_TRUCO_1_A_COMPARAR = "";
        FRASE_NUEVO_JUEGO = "nuevo";
        FRASE_NUEVO_JUEGO_A_COMPARAR = "";
    }

    private void inicializarArchivoTiempo() {
        archivo_tiempo = new ArchivoExistente(RUTA_ARCHIVO_TIEMPOS);
        Archivo.setArchivoSoloLectura(RUTA_ARCHIVO_TIEMPOS);
    }

    private void setLabelPorcentaje() {
        try{
            int ancho, alto, minas;

            ancho = Integer.parseInt(anc.getText().trim());
            alto = Integer.parseInt(alt.getText().trim());
            minas = Integer.parseInt(min.getText().trim());
            lblporcentaje.setText("Porcentaje de Dificultad: "+Float.toString((minas * 100) / (alto * ancho))+"%");
            
        }catch(NumberFormatException e){
            lblporcentaje.setText("Porcentaje de Dificultad:");
        }
    }

    private void guardarDatosEnArchivoTiempo() {
        new File(RUTA_ARCHIVO_TIEMPOS).setWritable(true);
        int cantidadDeRegistros = Integer.parseInt(archivo_tiempo.getValorDeConfiguracion("cantidad"));
        String nombre = mensajes.Mensajes.mostrarMensaje("FELICITACIONES", "Usted ha Ganado. ¡¡¡FELICITACIONES!!!\nIngrese su Nombre:");

        if(nombre != null){
            if(!nombre.trim().equalsIgnoreCase("")){
                int op = mensajes.Mensajes.mensajePreguntaSiNo("¿Desea registrar su puntaje en la Página Oficial?");
                if(op == mensajes.Mensajes.si){

                    Conexion.conectar();
                    try {
                        Conexion.sen = Conexion.con.createStatement();
                        Conexion.sen.execute("insert into puntaje values(NULL, '"+nombre+(TRUCO ? " (GANÓ CON TRAMPA)": "")+"', '"+Integer.toString(Integer.parseInt(segundos.getText()))+"', '"+NIVEL+"', "+CANTIDAD_DE_MINAS+", "+Float.toString(PORCENTAJE_DIFICULTAD)+", "+Integer.toString((int)(PORCENTAJE_DIFICULTAD * 1000) - Integer.parseInt(segundos.getText()))+")");
                        Conexion.sen.close();
                        mensajes.Mensajes.mensajeInformacion("Puntaje Registrado en la Página oficial");
                    } catch (SQLException ex) {
                        mensajes.Mensajes.mensajeError(ex.getMessage());
                    } catch (NullPointerException ex) {
                        mensajes.Mensajes.mensajeError("No se puede establecer Conexion con el servidor\nSe registrará el puntaje localmente");
                    }
                }

                archivo_tiempo.actualizarCampo("cantidad", Integer.toString(cantidadDeRegistros+1));
                archivo_tiempo.setCampoDeConfiguracion("nombre"+(cantidadDeRegistros+1), nombre);
                archivo_tiempo.setCampoDeConfiguracion("tiempo"+(cantidadDeRegistros+1), Integer.toString(Integer.parseInt(segundos.getText())));
                archivo_tiempo.setCampoDeConfiguracion("nivel"+(cantidadDeRegistros+1), NIVEL);
                archivo_tiempo.setCampoDeConfiguracion("minas"+(cantidadDeRegistros+1), Integer.toString(CANTIDAD_DE_MINAS));
                archivo_tiempo.setCampoDeConfiguracion("porcentaje"+(cantidadDeRegistros+1), Float.toString(PORCENTAJE_DIFICULTAD)+"%");
                archivo_tiempo.setCampoDeConfiguracion("puntaje"+(cantidadDeRegistros+1), Integer.toString((int)(PORCENTAJE_DIFICULTAD * 1000) - Integer.parseInt(segundos.getText())));
                tablaDeTiemposActionPerformed(null);
                Archivo.setArchivoSoloLectura(RUTA_ARCHIVO_TIEMPOS);
            }else{
                mensajes.Mensajes.mensajeError("Debe ingresar algún Nombre");
            }
            
        }
        TRUCO = false;
    }

    private void ordenarPuntajes(int[][] puntajes) {
        int i, j, incremento, temp, temp2;
        final int CODIGO = 0, PUNTAJE = 1;
        incremento = puntajes.length/2;
        while(incremento > 0){
            for(i=incremento; i < puntajes.length; i++){
                j = i;
                temp2 = puntajes[i][CODIGO];
                temp = puntajes[i][PUNTAJE];
                while((j >= incremento) && (puntajes[j-incremento][PUNTAJE] > temp)){
                    puntajes[j][CODIGO] = puntajes[j - incremento][CODIGO];
                    puntajes[j][PUNTAJE] = puntajes[j - incremento][PUNTAJE];
                    j = j - incremento;
                }
                puntajes[j][CODIGO] = temp2;
                puntajes[j][PUNTAJE] = temp;
            }
        incremento /= 2;
        }
    }

    private int getBanderasPartidaGuardada(String archivo) {
        String[] lineas = archivo.split("\n");
        int cont = 0;
        boolean e = false;
        for(int i=0; i<lineas.length;i++){
            if(lineas[i].contains("alto")){
                break;
            }else if(e){
                for(int j=0; j<lineas[i].length(); j++){
                    if(lineas[i].charAt(j) == 'b'){
                        cont++;
                    }
                }
            }
            if(lineas[i].equalsIgnoreCase("tab_aux") && !e){
                e = true;
            }
        }
        return cont;
    }

    private void getTabVirtualPartidaGuardada(String[][] tabVirtual, String archivo) {
        String[] lineas = archivo.split("\n");
        boolean e = false;
        int j=0;
        for(int i=0; i<lineas.length;i++){
            if(lineas[i].contains("alto")){
                break;
            }else if(e){
                tabVirtual[j] = lineas[i].split(" ");
                j++;
            }
            if(lineas[i].equalsIgnoreCase("tab_aux") && !e){
                e = true;
            }
        }
    }

    private void getTabPartidaGuardada(int[][] t, String archivo, int al, int an) {
        String[] lineas = archivo.split("\n");
        String[][] tab2 = new String[al][an];
        boolean e = false;
        int j = 0;
        for(int i=0; i<lineas.length;i++){
            if(lineas[i].contains("tab_aux")){
                break;
            }else if(e){
                tab2[j] = lineas[i].split(" ");
                j++;
            }
            if(lineas[i].equalsIgnoreCase("tab") && !e){
                e = true;
            }
        }


        for(int i=0;i<tab2.length; i++){
            for(int k=0;k<tab2[i].length; k++){
                t[i][k] = Integer.parseInt(tab2[i][k].trim());
            }
        }

    }

    private void iniciarJuegoAutomatico() {
        ArchivoDesencriptado ardes = new ArchivoDesencriptado();

        ardes = desencriptar(RUTA_ARCHIVO_GUARDADO_AUTOMATICO);
        ArchivoDeConfiguracion ac = new ArchivoExistente(ardes.getRuta());
        String n;

        int al, an, m, s, banderas;

        al = Integer.parseInt(ac.getValorDeConfiguracion("alto"));
        an = Integer.parseInt(ac.getValorDeConfiguracion("ancho"));
        s = Integer.parseInt(ac.getValorDeConfiguracion("segundos"));
        m = Integer.parseInt(ac.getValorDeConfiguracion("minas"));
        n = ac.getValorDeConfiguracion("nivel");

        String[][] tabVirtual = new String[al][an];
        int[][] t = new int[al][an];
//        try {
            if(m == 0){
//                this.iniciarJuego(10, 9, 9, "Nivel Principiante (9x9)");
            }else{
                getTabVirtualPartidaGuardada(tabVirtual, Archivo.leerArchivo(ardes.getRuta()));
                getTabPartidaGuardada(t, Archivo.leerArchivo(ardes.getRuta()), al, an);
                banderas = getBanderasPartidaGuardada(Archivo.leerArchivo(ardes.getRuta()));
                iniciarJuegoGuardado(m, al, an, n, banderas, s, tabVirtual, t);
            }
//        } catch (IOException ex) {
//            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
//        }
    }

    private void estallarMinas() {
        menupausar.setEnabled(false);
        menuguardar.setEnabled(false);
        h.setEstado(false);
        monito.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/monito_triste.PNG")));

        for(int i=0;i<BuscaMina.getTab().length;i++){
            for(int j=0;j<BuscaMina.getTab()[0].length;j++){
                if(labels[i][j].getIcon() != null){
                    if(BuscaMina.getNombreIcono(labels[i][j].getIcon().toString()).equalsIgnoreCase("bandera") && BuscaMina.getTab()[i][j] != BuscaMina.MINA){
                        labels[i][j].setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/mina_mal.PNG")));
                        repaint(labels[i][j].getX(), labels[i][j].getY(), ANCHO_BOTON, ALTO_BOTON);
                    }
                }
            }
        }
        while(CANTIDAD_DE_MINAS != 0){
            puntoMina = BuscaMina.buscarMinas();
            CANTIDAD_DE_MINAS--;
            labels[puntoMina.getX()][puntoMina.getY()].setText("");
            if(labels[puntoMina.getX()][puntoMina.getY()].getIcon() == null){
                labels[puntoMina.getX()][puntoMina.getY()].setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/mina.PNG")));
                repaint(labels[puntoMina.getX()][puntoMina.getY()].getX(), labels[puntoMina.getX()][puntoMina.getY()].getY(), ANCHO_BOTON, ALTO_BOTON);
            }else{
                String nombreIcono = BuscaMina.getNombreIcono(labels[puntoMina.getX()][puntoMina.getY()].getIcon().toString());
                if(nombreIcono.equalsIgnoreCase("?")){
                    labels[puntoMina.getX()][puntoMina.getY()].setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/mina.PNG")));
                    repaint(labels[puntoMina.getX()][puntoMina.getY()].getX(), labels[puntoMina.getX()][puntoMina.getY()].getY(), ANCHO_BOTON, ALTO_BOTON);
                }
            }

        }
        BuscaMina.deshabilitarLabels(labels);
    }

    private void escribirEnArchivo(String ruta, String texto, boolean sobreescribir) {
        cifrado = Encriptacion.encriptarTexto(texto);
        try {
            Archivo.escribirEnAchivo(ruta, cifrado, sobreescribir);
        } catch (IOException ex) {
            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private ArchivoDesencriptado desencriptar(String rutaArchivo) {
        try {
            ArchivoDesencriptado ardes = new ArchivoDesencriptado();
            File archi = new File(rutaArchivo+".tmp");
            String texto = "";
            String linea;
            
            FileInputStream fis = null;
            BufferedReader reader = null;
            fis = new FileInputStream(rutaArchivo);
            reader = new BufferedReader(new InputStreamReader(fis));

            while ((linea = reader.readLine()) != null) {
                texto += Encriptacion.desencriptar(linea)+"\n";
                Archivo.escribirEnAchivo(rutaArchivo+".tmp", Encriptacion.desencriptar(linea), false);
            }

            ardes.setRuta(rutaArchivo+".tmp");
            ardes.setTextoDesencriptado(texto);
            return ardes;
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        } catch (IOException ex) {
            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
        
    }

    private void cambiarTamañoBotones(int altBoton, int anchBoton) {
        
        int puntoX, puntoY;

        puntoX = PUNTO_DE_INICIO_X;
        puntoY = PUNTO_DE_INICIO_Y;
        ALTO_BOTON = altBoton;
        ANCHO_BOTON = anchBoton;
        TAMAÑO_NUMEROS = (ALTO_BOTON > ANCHO_BOTON ? ANCHO_BOTON-2 : (ALTO_BOTON < ANCHO_BOTON ? ALTO_BOTON-2 : ALTO_BOTON-2));
         for(int i=0;i<ALTO;i++){
            for(int j=0;j<ANCHO;j++){
                labels[i][j].setDoubleBuffered(true);
                labels[i][j].setFont(new java.awt.Font("Tahoma", 1, TAMAÑO_NUMEROS));
                getContentPane().add(labels[i][j], new org.netbeans.lib.awtextra.AbsoluteConstraints(puntoX, puntoY, ANCHO_BOTON, ALTO_BOTON));

                //labels[i][j].setName("l_"+i+"_"+j+"");
                if(j == (ANCHO-1)){
                    puntoX = PUNTO_DE_INICIO_X;
                    puntoY += ALTO_BOTON;
                }else{
                    puntoX += ANCHO_BOTON;
                }
            }
         }
        getContentPane().add(lbl_nivel, new org.netbeans.lib.awtextra.AbsoluteConstraints(puntoX, puntoY, ANCHO*17,15));

        
        Redimensionar.redimensionarFormulario(this, false, TITULO);
        getContentPane().add(segundos, new org.netbeans.lib.awtextra.AbsoluteConstraints(this.getWidth()-64, 8, 60, 25));
        getContentPane().add(monito, new org.netbeans.lib.awtextra.AbsoluteConstraints((this.getWidth() / 2)-12, 8, 25, 25));

        this.setAnchoAltoPantalla();
        
        
    }

    private class HiloSegundos extends Thread{
        private int cont = 0;
        private boolean estado = false;

        public void run(){
            try {
                while(true){
                    if(isEstado()){
                        segundos.setText((cont < 10 ? "000": (cont < 100 ? "00": (cont < 1000 ? "0":"")))+Integer.toString(cont));
                        cont++;
                    }
                    Thread.sleep(1000);
                }
            } catch (InterruptedException ex) {
                Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        public int getSegundos(){
            return cont;
        }

        /**
         * @param cont the cont to set
         */
        public void setCont(int cont) {
            this.cont = cont;
        }

        /**
         * @param estado the estado to set
         */
        public void setEstado(boolean estado) {
            this.estado = estado;
        }

        /**
         * @return the estado
         */
        public boolean isEstado() {
            return estado;
        }

        private String getNombreIcono(String rutaCompletaIcono) {
                        String[] ruta = rutaCompletaIcono.split("/");
                        String nombre = ruta[ruta.length-1].replaceAll(".PNG", "");
                        return nombre;
                    }
    }

    private void setContMinas(){
        contMinas.setText((CANTIDAD_DE_MINAS_LABEL < 0 ? "-": "")+(CANTIDAD_DE_MINAS_LABEL < 10 ? "000": (CANTIDAD_DE_MINAS_LABEL < 100 ? "00": (CANTIDAD_DE_MINAS_LABEL < 1000 ? "0":"")))+Integer.toString(Math.abs(CANTIDAD_DE_MINAS_LABEL)));
    }

    
}
